#ifndef __THREAD_HPP__
#define __THREAD_HPP__

#include <iostream>
#include <string>
#include <unistd.h>
#include <functional>
#include <pthread.h>

using namespace std;

using func_t = function<void(string)>;

class Thread
{
public:
    void Excute()
    {
        _func(_threadname);
    }
    Thread(func_t func, string name = "none-name")
        : _func(func), _threadname(name), _stop(true)
    {   }
    // 注意：类成员函数，形参是有this指针，这里需要使用静态函数
    // 若使用非静态函数不能指定参数，默认第一个参数就是this指针
    static void* threadroutine(void* args) 
    {
        Thread* self = static_cast<Thread*>(args);
        self->Excute();
        return nullptr;
    }
    bool Start()
    {
        int n = pthread_create(&_tid, nullptr, threadroutine, this);
        if(!n)
        {
            _stop = false;
            return true;
        }
        else
        {
            return false;
        }
    }
    void Detach()
    {
        if(!_stop)
        {
            pthread_detach(_tid);
        }
    }
    void Join()
    {
        if(!_stop)
        {
            pthread_join(_tid, nullptr);
        }
    }
    string name()
    {
        return _threadname;
    }
    void Stop()
    {
        _stop = true;
    }
    ~Thread() {    }

private:
    pthread_t _tid;
    string _threadname;
    func_t _func;
    bool _stop;
};

#endif